package com.viamo.concilia.config;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.viamo.concilia.negocio.Campo;
import com.viamo.concilia.negocio.FormatoArchivo;
import com.viamo.concilia.negocio.FormatoCampo;
import com.viamo.concilia.negocio.FormatoEntrada;
import com.viamo.concilia.negocio.TipoDato;



public class FormatManager {

private static List<FormatoArchivo> formatos;

public static List<FormatoArchivo> getFormatos(){
	
	if (formatos==null){
		
		formatos=new ArrayList<FormatoArchivo>();
		formatos=leerFormatos();
	}
	
	return formatos;
	
}

private static List<FormatoArchivo>leerFormatos(){
	 
	 //Se crea un SAXBuilder para poder parsear el archivo
	DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance ( );
	dbFactory.setIgnoringElementContentWhitespace(true);
    Document xmlDocument = null;
    File xmlFile = new File(ViamoNetGlobalConstants.CONFIGURATION_FILE_FULL_NAME );
	
    formatos = new ArrayList<FormatoArchivo>();
    
    try{
	        //Se crea el documento a traves del archivo
	    	DocumentBuilder builder;
			builder = dbFactory.newDocumentBuilder();
			xmlDocument = builder.parse( xmlFile );
				 
	        //Se obtiene la raiz 'SYSTEM'
	        Node rootNode = xmlDocument.getFirstChild();
	        
	        NodeList childNodes = rootNode.getChildNodes();
	        for ( int i = 0; i < childNodes.getLength(); i++ ){
	            Node child = (Node) childNodes.item(i);
	            if(child.getNodeName().equalsIgnoreCase(ViamoNetGlobalConstants.TAG_FILE_FORMAT)){
	            	   		
		        	NamedNodeMap attributes = child.getAttributes();
		        	FormatoEntrada formato=new FormatoEntrada();
		        	formato.setName(attributes.getNamedItem("NAME").getNodeValue());
		        	formato.setDescription(attributes.getNamedItem("DESCRIPTION").getNodeValue());
		        	formato.setFila_inicial(attributes.getNamedItem("FILA_INICIAL").getNodeValue());
		        	formato.setFila_titulos(attributes.getNamedItem("FILA_TITULOS").getNodeValue());
		        	formato.setHoja_activa(attributes.getNamedItem("HOJA_ACTIVA").getNodeValue());
		        	NodeList listaParametrosFtm = child.getChildNodes();
		        	
		        	for(int h=0;h<listaParametrosFtm.getLength();h++){
		        				        		        		
		            		Node nodeCampo = (Node) listaParametrosFtm.item(h);
		            		NamedNodeMap attrCampo = nodeCampo.getAttributes();
		            		
	               			if(nodeCampo.getNodeName().equalsIgnoreCase(ViamoNetGlobalConstants.TAG_FIELD)){
		               				Campo campo=new Campo();
		           					campo.setNombre(attrCampo.getNamedItem("NAME").getNodeValue());
		          					campo.setDescripcion(attrCampo.getNamedItem("DESCRIPTION").getNodeValue());
		           					campo.setColumna(attrCampo.getNamedItem("COLUMN").getNodeValue());
		           					campo.setFormato(new FormatoCampo(attrCampo.getNamedItem("FORMAT").getNodeValue()));
		           					campo.setTipoDato(TipoDato.getTipoDato(attrCampo.getNamedItem("TYPE").getNodeValue()));
		            				formato.agregarCampo(campo);
		            				
	               			}
	      		
			        		
		        	}
		        	formatos.add(formato);
		        }
	        }
	        
	       return formatos;
	       
	    }catch ( IOException io ) {
	        System.out.println( io.getMessage() );
	        return null;
	    }catch (ParserConfigurationException e) {
	    	e.printStackTrace();
	    	return null;
		} catch (SAXException e) {
			e.printStackTrace();
			return null;
		}
	 
	 
 }
 
public static List<String>getFormatNames(){
	
	List<String> nombreFormatos=new ArrayList<String>();
	
	List<FormatoArchivo> f=getFormatos();
	
	for (int i=0;i<f.size();i++){
		nombreFormatos.add(f.get(i).getName());
	}
	
	return nombreFormatos;
	
	
}

public static FormatoArchivo getFormato(String formatName){
	
	List<FormatoArchivo> f=getFormatos();
	
	for (int i=0;i<f.size();i++){
		
		if (f.get(i).getName().equalsIgnoreCase(formatName)){
			return f.get(i);
		}
	}
	
	return null;
	
	
}

public static List<Campo>getFieldsForFormat(String formatName){
	
	
	FormatoArchivo f=getFormato(formatName);
	
	if (!(f==null)){
		return f.getCampos();
		
	}
	
	return null;
	
	
}


}
